package eSchool.Server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import eSchool.BL.Aluno;
import eSchool.BL.AlunoInscrito;
import eSchool.BL.Alunos;
import eSchool.BL.AlunosInscritos;
import eSchool.BL.CriteriosPesquisa;
import eSchool.BL.Disciplina;
import eSchool.BL.Disciplinas;
import eSchool.BL.Docente;
import eSchool.BL.Docentes;
import eSchool.BL.EntidadeBase;
import eSchool.BL.Funcionario;
import eSchool.BL.Funcionarios;
import eSchool.BL.DisciplinasInscrito;
import eSchool.BL.DisciplinaInscrito;
import eSchool.BL.Utilizador;
import eSchool.BL.Utilizadores;
import eSchool.Watcher.ISchoolWatcher;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
// </editor-fold> 
public class SchoolServer extends UnicastRemoteObject implements ISchoolServer {

    private ArrayList<ISchoolWatcher> watcherLista = new ArrayList<ISchoolWatcher>();
    
    public SchoolServer() throws Exception {
        makeRmiServer();
    }

    public Utilizador logIn(String codUtilizador, String palavraChave) {
         try {
            Utilizador utilizador = new Utilizador();
            utilizador.leDados(codUtilizador, palavraChave);
            return utilizador;
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void logOut(String utilizador) {
    }

    public void logOut(EntidadeBase entidadeBase) {
    }

    public Aluno getAluno(String numAluno) {
        try {
            return new Aluno(numAluno);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
   public Alunos getAlunos(CriteriosPesquisa criterios) {
        try {
            return new Alunos(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public Docente getDocente(int idDocente) {
        try {           
            return new Docente(idDocente);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public Docentes getDocentes(CriteriosPesquisa criterios) {
        try {
            return new Docentes(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

    }

    public Funcionario getFuncionario(int idFuncionario) {
        try {
            return new Funcionario(idFuncionario);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public Funcionarios getFuncionarios(CriteriosPesquisa criterios) {
        try {
            return new Funcionarios(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    public Disciplina getDisciplina(String codDisciplina) throws RemoteException {
        try {
            return new Disciplina(codDisciplina);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public Disciplinas getDisciplinas(CriteriosPesquisa criterios) throws RemoteException {
           try {
                return new Disciplinas(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
     public AlunoInscrito getAlunoInscrito(String numAluno) {
        try {
            AlunoInscrito alunoInscrito = new AlunoInscrito();
            alunoInscrito.leDados(numAluno);
            return alunoInscrito;
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
   
   public AlunosInscritos getAlunosInscritos(CriteriosPesquisa criterios) {
        try {
            return new AlunosInscritos(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
     
   
   public DisciplinaInscrito getDisciplinaInscrito(String codDisciplina, String numAluno) {
        try {
            DisciplinaInscrito disciplinaInscrito = new DisciplinaInscrito();
            disciplinaInscrito.leDados(codDisciplina, numAluno);
            return disciplinaInscrito;
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
   
   public DisciplinasInscrito getDisciplinasInscrito(CriteriosPesquisa criterios) {
        try {
            return new DisciplinasInscrito(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
   
    public Utilizador getUtilizador(String codUtilizador) {
        try {
            Utilizador utilizador = new Utilizador();
            utilizador.leDados(codUtilizador);
            return utilizador;
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
   public Utilizadores getUtilizadores(CriteriosPesquisa criterios) {
        try {
            return new Utilizadores(criterios);
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

   
   
    public void gravaAluno(Aluno aluno){
         try {
             
            aluno.gravaDados();

        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void gravaFuncionario(Funcionario funcionario){
                
        try {
            funcionario.gravaDados();
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void gravaDocente(Docente docente){
         try {
            docente.gravaDados();
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void gravaDisciplina(Disciplina disciplina){
         try {         
            disciplina.gravaDados();
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
     public void gravaUtilizador(Utilizador utilizador){
         try {         
            utilizador.gravaDados();
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     
    public void gravaAlunoInscrito(AlunoInscrito alunoInscrito){
         try {         
            alunoInscrito.gravaDados();
        } catch (Exception ex) {
            Logger.getLogger(SchoolServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
    
    @Override
    public void registaWatcher(ISchoolWatcher watcher) {
        watcherLista.add(watcher);
    }
    
    
    private void makeRmiServer() throws Exception{
        int porto = 1099;
        Registry ror = LocateRegistry.createRegistry(porto);
        Thread.sleep(4000);
        ror.rebind("eSchoolServer",this);
    }

    


}

